package Day021_反射_注解.demo1_类的加载;

/**
 * @Author：pengzhilin
 * @Date: 2020/5/14 8:54
 */
public class Test {
    public static void main(String[] args) throws Exception{
        /*
           类的加载
                - 当我们的程序在运行后，第一次使用某个类的时候，会将此类的class文件读取到内存，并将此类的所有信息存储到一个Class对象中
           类的加载时机
                1. 创建类的实例。
                2. 类的静态变量，或者为静态变量赋值。
                3. 类的静态方法。
                4. 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象。
                5. 初始化某个类的子类。
                6. 直接使用java.exe命令来运行某个主类。
                以上六种情况的任何一种，都可以导致JVM将一个类加载到方法区。

                获取类加载器: 类的Class对象调用getClassLoader()方法
         */
        //  1. 创建类的实例。
        //  Student stu = new Student();

        // 2. 类的静态变量，或者为静态变量赋值。
        // Person.country = "中国";

        // 3. 类的静态方法。
        // Person.method();

        // 4. 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象。
        // Class<?> c = Class.forName("com.itheima.demo1_类的加载.Student");

        //  5. 初始化某个类的子类。
        // Zi zi = new Zi();

        // 6. 直接使用java.exe命令来运行某个主类。

        // 获取类加载器:
        // 获取Student类的类加载器
        System.out.println(Student.class.getClassLoader());// AppClassLoader
        // 获取String类的类加载器
        System.out.println(String.class.getClassLoader());// null
        // API中说明：一些实现可能使用null来表示引导类加载器。 如果此类由引导类加载器加载，则此方法将在此类实现中返回null


        System.out.println(Student.class.getClassLoader().getParent());// PlatformClassLoader
        System.out.println(Student.class.getClassLoader().getParent().getParent());// null 引导类加载器加载

    }
}
